﻿#include<iostream>
using namespace std;

//菱形继承的缺点
class Person
{
public:
	Person(const char* name)
		:_name(name)
	{}
	string _name; // 姓名
};

class Student : virtual public Person
{
public:
	Student(const char* name, int num)
		:Person(name)//不会调用
		, _num(num)
	{}
protected:
	int _num; //学号
};

class Teacher : virtual public Person
{
public:
	Teacher(const char* name, int id)
		:Person(name)//不会调用
		, _id(id)
	{}
protected:
	int _id; // 职⼯编号
};

// 不要去玩菱形继承
class Assistant : public Student, public Teacher
{
public:
	Assistant(const char* name1, const char* name2, const char* name3)
	:Person(name3)//只会在这里的时候调用Person的构造，下面两个不会去调用person的构造
	, Student(name1, 1)
	, Teacher(name2, 2)
{}
protected:
	string _majorCourse; // 主修课程
};

//int main()
//{
//	//这里的对象实例化，就看最后一个"王五"
//	//第一个和第二个在调用构造函数时，不会去调用父类的构造函数
//	Assistant a("张三", "李四", "王五");
//	return 0;
//}


//多继承中指针偏移问题
class Base1 { public: int _b1; };
class Base2 { public: int _b2; };
class Derive : public Base1, public Base2 { public: int _d; };
//先继承的先声明，所以Base1的指针指向的地址和Derive对象地址相同
int main()
{
	Derive d;
	Base1* p1 = &d;
	Base2* p2 = &d;
	Derive* p3 = &d;
	return 0;
}